How to define a generic types that will hold many other diferent types